package com.shijimo.server.service;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.shijimo.server.domain.CourseCategory;
import com.shijimo.server.domain.CourseCategoryExample;
import com.shijimo.server.dto.CategoryDto;
import com.shijimo.server.dto.CourseCategoryDto;
import com.shijimo.server.dto.PageDto;
import com.shijimo.server.mapper.CourseCategoryMapper;
import com.shijimo.server.util.CopyUtil;
import com.shijimo.server.util.UuidUtil;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.List;

/**
 * @author Dream_飞翔
 * @email 1072876976@qq.com
 */

@Service
public class CourseCategoryService {
    @Resource
    private CourseCategoryMapper courseCategoryMapper;

    /**
     * 查询列表方法
     *
     * @param pageDto 分页对象
     */
    public void list(PageDto pageDto) {
        // 开启mybatis分页，pageNum从1开始
        // 生效的位置是开启分页后下方的第一个select语句
        PageHelper.startPage(pageDto.getPage(), pageDto.getSize());

        CourseCategoryExample courseCategoryExample = new CourseCategoryExample();


        // 进行查询
        List<CourseCategory> courseCategoryList = courseCategoryMapper.selectByExample(courseCategoryExample);

        PageInfo<CourseCategory> pageInfo = new PageInfo<>(courseCategoryList);
        // 查询到的总条数
        pageDto.setTotal(pageInfo.getTotal());

        List<CourseCategoryDto> courseCategoryDtoList = CopyUtil.copyList(courseCategoryList, CourseCategoryDto.class);
        // 设置最终的查询结果
        pageDto.setList(courseCategoryDtoList);
    }

    /**
     * 保存修改结果
     * 1. 如果从前端传来的对象中Id有值的话就是更新操作
     * 2. 如果Id为空则说明是进行新增操作
     *
     * @param courseCategoryDto
     */
    public void save(CourseCategoryDto courseCategoryDto) {
        CourseCategory courseCategory = CopyUtil.copy(courseCategoryDto, CourseCategory.class);
        // 判断Id是否有值
        if (StringUtils.isEmpty(courseCategoryDto.getId())) {
            this.insert(courseCategory);
        } else {
            this.update(courseCategory);
        }
    }

    /**
     * 添加方法
     */
    private void insert(CourseCategory courseCategory) {

        // 设置Id
        courseCategory.setId(UuidUtil.getShortUuid());
        courseCategoryMapper.insert(courseCategory);
    }

    /**
     * 更新方法
     */
    private void update(CourseCategory courseCategory) {

        courseCategoryMapper.updateByPrimaryKey(courseCategory);
    }

    /**
     * 删除方法
     */
    public void delete(String id) {
        courseCategoryMapper.deleteByPrimaryKey(id);
    }

    /**
     * 根据某一课程，前将课程分类进行清空，在保存课程分类
     *
     * @param courseId 课程ID
     * @param dtoList  勾选的分类集合
     */
    @Transactional
    public void saveBatch(String courseId, List<CategoryDto> dtoList) {
        // 生成本地变量
        CourseCategoryExample example = new CourseCategoryExample();
        // 先将当前库中的内容进行删除
        example.createCriteria().andCourseIdEqualTo(courseId);
        courseCategoryMapper.deleteByExample(example);

        for (int i = 0; i < dtoList.size(); i++) {
            // 先将集合中的Dto对象单独获取出来
            CategoryDto categoryDto = dtoList.get(i);
            CourseCategory courseCategory = new CourseCategory();
            // 设置course_category表的ID
            courseCategory.setId(UuidUtil.getShortUuid());
            courseCategory.setCourseId(courseId);
            courseCategory.setCategoryId(categoryDto.getId());
            insert(courseCategory);
        }
    }

    /**
     * 查找课程所属的所有分类
     *
     * @param courseId 课程ID
     * @return 所属的分类集合
     */
    public List<CourseCategoryDto> listByCourse(String courseId) {
        // 创建查询对象
        CourseCategoryExample example = new CourseCategoryExample();
        // 定义查询条件
        example.createCriteria().andCourseIdEqualTo(courseId);
        // 根据定义好的条件进行查询
        List<CourseCategory> courseCategoryList = courseCategoryMapper.selectByExample(example);
        // 将查询到的列表集合返回
        return CopyUtil.copyList(courseCategoryList, CourseCategoryDto.class);
    }
}
